package tp1;


import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.lang.System;
import java.net.Socket;
import java.util.Iterator;

// Thread du serveur qui envoie les groupes/utilisateurs au client


public class ServeurListes extends Thread{

    private static Serveur serveur;
	private BufferedReader in = null;
	private PrintWriter out = null;
    private Socket c_socket;
    private boolean continuer = true;
    
    public ServeurListes(Socket s){
         c_socket = s;
         serveur = Serveur.getInstance();
     }
     
     public void run() {
         Iterator<Utilisateur> it = serveur.utilisateurs.iterator();
         Iterator<Groupe> itg = serveur.groupes.iterator();
         String [] adresse = new String[4];
         String listeUtilisateurs="";
         String listeGroupes="";
         String port,nom;
         String message;
         Utilisateur u;
         Groupe g;
         int count=0;


         try {
				in = new BufferedReader(new InputStreamReader(c_socket.getInputStream()));
				out = new PrintWriter(new OutputStreamWriter(c_socket.getOutputStream()));

				while (continuer) {

					String reponseServeur = "";
					reponseServeur = "Il y a "+ServeurThread.nbre_client+" clients connectés.";
					out.println(reponseServeur);
					out.flush();
                    // Envoi de la liste d'utilisateurs
                    listeUtilisateurs="";
                    count=0;
                    it = serveur.utilisateurs.iterator();
                    serveur.debug("=====================================");
                    serveur.debug("Liste d'utilisateurs : ");
                    serveur.debug("Id.       | Adresse       |Port ");
                    serveur.debug("----------+---------------+-----");
                    while(it.hasNext()) {
                        count++;
                        u = it.next();
                        nom = String.format("%-6s", u.getIdentifiant());
                        port = String.format("%05d",u.getPort()); //formatte le port sur 5 caractères
                        adresse = u.getAdresse().getHostAddress().split("\\.");
                        for(int i=0;i<adresse.length;i++) {
                            adresse[i] = String.format("%03d", Integer.parseInt(adresse[i])); //formatte l'adresse sous la forme 000.000.000.000
                        }
                        serveur.debug(nom+"|"+adresse[0]+"."+adresse[1]+"."+adresse[2]+"."+adresse[3]+"|"+port);
                        listeUtilisateurs+=adresse[0]+"."+adresse[1]+"."+adresse[2]+"."+adresse[3]+port+nom;
                    }
                    serveur.debug("=====================================");
                    message = "LUT"+String.format("%02d",count)+listeUtilisateurs;

                    out.println(message);
                    out.flush();

                    //Envoi de la liste de groupes
                    listeGroupes="";
                    itg = serveur.groupes.iterator();
                    count=0;
                    serveur.debug(serveur.ANSI_RED+"[ThreadMsg]"+serveur.ANSI_RESET);
                    serveur.debug("=====================================");
                    serveur.debug("Liste de groupes : ");
                    while(itg.hasNext()) {
                        count++;
                        g = itg.next();
                        nom = String.format("%-6s",g.getNom());
                        port = String.format("%05d",g.getPort()); //formatte le port sur 5 caractères
                        adresse = g.getAdresseMulticast().getHostAddress().split("\\.");
                        serveur.debug("Groupe n°"+count+" Nom : "+nom+" Port : "+port);
                        for(int i=0;i<adresse.length;i++) {
                            adresse[i] = String.format("%03d", Integer.parseInt(adresse[i])); //formatte l'adresse sous la forme 000.000.000.000
                        }
                        listeGroupes+=adresse[0]+"."+adresse[1]+"."+adresse[2]+"."+adresse[3]+port+nom;
                    }
                    serveur.debug("=====================================");

                    message = "LGR"+String.format("%02d",count)+listeGroupes;

                    out.println(message);
                    out.flush();
                    sleep(5000);

                }

         } catch (Exception e) {
				e.printStackTrace();
			} finally {
				// Nettoyage
				try {
					in.close();
					out.close();
					c_socket.close();
					System.out.println("C'est fini pour ce client.");
				} catch (IOException io_Exception) {
					io_Exception.printStackTrace();
				}
			}
		}

}
